/*
 * algorithm.h
 *
 *  Created on: 26/04/2013
 *      Author: jose
 */

#ifndef ALGORITHM_H_
#define ALGORITHM_H_

#include "graph.h"
#include "misc.h"

/*
 * URL y puerto de una solicitud
 */
struct access_st
{
	String * url;		// URL accedida
	String * timestamp;	// Momento de acceso
	unsigned port;		// Puerto desde el cual se solicito la URL
};
typedef struct access_st Access;

/*
 * Corresponde a todas las URLs accedidas desde una IP única
 */
struct session_st
{
	String * ip;				// IP desde donde se accedió a las URLs
	unsigned len;			// Cantidad de accesos
	Access * access;		// Datos de los accesos
};
typedef struct session_st Session;

/*
 * Corresponde a todas las sesiones obtenidas de un reporte
 */
struct sessions_st
{
	unsigned len;			// Cantidad de sesiones
	unsigned total_urls; 	// Cantidad de URLs distintas presentes en la session
	Session * s;			// Array de sesiones
};
typedef struct sessions_st Sessions;

/*
 * Ventana del algoritmo del grafo dirigido
 */
struct window_st
{
	unsigned len;		// Tamaño de la ventana
	unsigned empty;	// Indice de la posición vacía dentro de la ventana
	unsigned * window;	// Guarda los indices de los headnodes de las URLs
						// 	dentro de la ventana
};
typedef struct window_st Window;

/*
 * Estructura para guardar transiciones seleccionadas con top N o con threshold
 */
struct results_st
{
	Headnode * from;	// Referencia al headnode desde donde parte la transición
	Node * to;			// Referencia al node destino de la transición
	struct results_st * prev; // Referencia al anterior resultado
	struct results_st * next; // Referencia al siguiente resultado
};
typedef struct results_st Results;


Window *
window_create(unsigned len);

Sessions *
sessions_create();

Session *
session_add(Sessions * sess, unsigned len, const char **urls);

Session *
session_create(unsigned len);

Access *
access_create(unsigned len);

Graph_Adj_List *
sessions_load_urls_to_adj_list(Graph_Adj_List * gr, Sessions * sess);

void
window_zero(Window * win);

void
update_arcs_from_window(Graph_Adj_List * gr, Window * win, const String * url);

void
window_purge(Window * win);

unsigned
window_add_to_window(Window * win, unsigned index, unsigned top);

Graph_Adj_List *
calculate_conf(Graph_Adj_List * gr);

Results *
calculate_conf2(Graph_Adj_List * gr);

Results *
order_results_by_conf(Graph_Adj_List * gr);

Results *
directed_graph(Graph_Adj_List * gr, Sessions * sess, unsigned window_len);

void
results_print(Graph_Adj_List * gr, Results * res);

#endif /* ALGORITHM_H_ */
